////多态揭秘--虚函数表
//#include <iostream>
//using namespace std;
//
//class A {//编译器根据A类信息，将制作一张虚函数表 A::foo的地址 A::bar的地址
//public:
//	virtual void foo() { cout << "A::foo()" << endl; }
//	virtual void bar() { cout << "A::bar()" << endl; }
//};
//class B :public A {//编译器根据B类信息，将制作一张虚函数表 B::foo的地址 A::bar的地址
//public:
//	void foo() { cout << "B::foo()" << endl; }
//};
//
//int main(void) {
//	A a;//|虚表指针|-->编译器根据A类型信息制作的虚函数表
//	cout << "a对象的大小:" << sizeof(a) << endl;//8
//	B b;//|虚表指针|-->编译器根据B类信息制作的虚函数表
//	cout << "B对象的大小:" << sizeof(b) << endl;//8
//
//	void(**pfunc)() = *((void(***)()) & a);//从a中取出虚表指针
//	pfunc[0]();//A::foo
//	pfunc[1]();//A::bar
//
//	void(**pfunc2)() = *((void(***)()) & b);//从b中取出虚表指针
//	pfunc2[0]();//B::foo
//	pfunc2[1]();//B::bar
//
//	A* pa = &b;
//	pa->foo();//编译器在编译期间并不知道到底调用哪个类的foo
//	//1.根据pa找到对象b所占的内存空间
//	//2.从b所占内存空间中获取虚表指针
//	//3.利用虚表指针找到编译器根据B类信息制作的虚函数表
//	//4.从虚函数表中获取虚函数的入口地址
//	//5.利用虚函数的入口地址调用虚函数
//
//	//调用普通函数的效率高于虚函数
//	return 0;
//}